<?php
class Data_Directory extends RecursiveDirectoryIterator
{
	private $_directorySet = null;
	private $_fileSet = null;
	private $_contentLoaded = false;
	
	
	public function __construct($path) {
		parent::__construct($path);
	}
	
	/**
	 * renvoie la liste des éléments contenus dans le répertoire
	 */
	private function _loadContent() 
	{
		if (!$this->_contentLoaded) {
			$this->_directorySet = new Data_DirectorySet();
			$this->_fileSet = new Data_FileSet();
			for ($this->rewind();$this->valid();$this->next()) {
				if ($this->isDot()) {
					continue;
				}
				
				if ($this->isDir()) {
					$this->_directorySet->add(new Data_Directory($this->current()->getPathName()));
				}			
				elseif ($this->isFile()) {
					$this->_fileSet->add(new Data_File($this->current()->getPathName()));
				}			
			}
			$this->_contentLoaded = true;
		}
	}
	
	public function __toString() {
		return $this->getFileName();
	}
	
	/**
	 * renvoie la liste des répertoires contenus dans le répertoire
	 * @return Data_Directoryset
	 */
	public function getDirectories() 
	{
		$this->_loadContent();
		return $this->_directorySet;
	}
	
	/**
	 * renvoie la liste des fichiers contenus dans le répertoire
	 * @return Data_Fileset
	 */
	public function getFiles() 
	{
		$this->_loadContent();
		return $this->_fileSet;
	}

	/**
	 * renvoie la liste des fichiers et répertoires dans le répertoire
	 * @return Data_SplFileInfoSet
	 */
	public function getContent() 
	{
		$this->_loadContent();
		$elements = new Data_SplFileInfoSet();
		foreach($this->_directorySet as $directory) {
			$elements->add($directory);
		}
		foreach($this->_fileSet as $file) {
			$elements->add($file);
		}
		return $elements;
	}

	/*
	 * Renvoie le chemin complet vers le fichier
	 */
	public function getFilePath() {
		return $this->getPath();
	}

	/*
	 * Renvoie le chemin complet vers le fichier
	 */
	public function getFileName() {
		return array_pop(explode(DIRECTORY_SEPARATOR,$this->getPath()));
	}
	
	/*
	 * Renvoie le chemin du répertoire parent
	 * @return string
	 */
	public function getParentPath() {
		$path = explode(DIRECTORY_SEPARATOR,$this->getPath());
		array_pop($path);
		return implode(DIRECTORY_SEPARATOR,$path);
	}
	
	/*
	 * Renvoie le répertoire parent
	 * @return Data_Directory
	 */
	public function getParent() {
		return new Data_Directory($this->getParentPath());
	}
	
	/**
	 * supprime l'élément
	 * 
	 */
	public function delete() 
	{
		if (!$result = rmdir($this->getFilePath())) {
			throw new App_Exception('Unable to delete directory '.$this->getFilePath());
		}
	}
	
	/**
	 * Renvoie le chemin relatif à partir du Data_Directory passé.
	 * Le répertoire passé en paramètre doit être un parent du répertoire actuel.
	 * @param Data_Directory $dir
	 * @return string
	 */
	public function getRelativePathFrom(Data_Directory $dir)
	{
		return str_replace(array($dir->getFilePath(),DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR),array('',DIRECTORY_SEPARATOR),$this->getFilePath());	
	}
	
	/**
	 * renvoie le fichier correspondant au nom donné
	 * @param string $name
	 */
	public function getFile($name)
	{
		return new Data_File($this->getFilePath().DIRECTORY_SEPARATOR.$name);
	}
	
	public function createDir($name)
	{
		mkdir($this->getFilePath().DIRECTORY_SEPARATOR.$name);
	}
}
?>